---
title: "Appendix for Mating systems and sex-biased disease"
output: 
  html_notebook:
      number_sections: yes
      toc: yes
      toc_float: yes
      theme: united
---

```{r setup, include=FALSE, warning = FALSE}
opts_chunk$set(warning = FALSE, message = FALSE)
```

```{=html}
<style type="text/css">
  body{
  font-size: 12pt;
}
</style>
```

# When does activity during the mating season start and end for each sex? (Figure 2, Top; Models 1-2)
## Model 1: First, test effect of sex on **_date of first annual detection_** (i.e., start of swarm).

```{r}
m1 = lmer(mindate2~sex + (1|site.wy2) + (1|pit_id),
              control=lmerControl(optimizer="bobyqa", optCtrl=list(maxfun=100000)), 
              data = df.m1); summary(m1)
```

- **_Result_**: _Females start autumn activity at hibernacula later than males._
  
## Model 2: Then, test effect of sex on **_date of last annual detection_** (i.e., end of swarm).

```{r}
m2 = lmer(maxdate2~sex + (1|site.wy2) + (1|pit_id),
              control=lmerControl(optimizer="bobyqa", optCtrl=list(maxfun=100000)),
              data = df.m2); summary(m2)
```

- **_Result_**: _Females end autumn activity at the hibernacula later than males._

## Plot Figure 2, Top. Results of dates of mating activity analyses (Models 1-2)
  - Top panel plots data and model coefficients that determined the active period
  - Bottom panel visualizes peaks in activity by sex
```{r}
print(p.fig2)
```

<div class = "alert alert-info" role="alert">
  - **_Key findings:_** _Females have a shorter active period, male activity fully encompasses female activity, and males remain highly active later into autumn._
</div>

# What factors contribute to sex differences in activity? (Figure 3A-C, Models 3-5)

## Model 3, Figure 3A: First, what are the effects of temperature and sex on **_nightly activity_**?

```{r}
# response: (1 = detected | 0 = undetected) 
m3 = glmer(detect2~bat.tavg*sex + (1|site.wy2) + (1|pit_id), family = binomial(),
            control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=100000)),
            data = subset(df.m3)); summary(m3)
```


```{r}
# view temperature slopes for each sex using emtrends
kable(m3.emt)
```

  - **_Result:_** _Females are less active throughout their swarm period generally, but female activity increases with temperature. Male activity is less influenced by temperature._

## Model 4, Figure 3B: Then, what are the effects of the length of the active period and sex on the **_probability of last detection_**?
  
```{r}
# response: 1 = last day active | 0 = detected on subsequent nights
m4 = glmer(last.det2~isa*sex + (1|site.wy2) + (1|pit_id), family=binomial(),
           control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=100000)),
           data=subset(df.m4));summary(m4)
```

  - **_Result:_** _Regardless of arrival date, females spend fewer days swarming than males before ending activity._
  
## Model 5, Figure 3C: Last, what are the effects of temperature and sex on the **_probability of last detection?_**
```{r}
# response: 1 = last day active | 0 = detected on subsequent nights
m5 = glmer(last.det2~bat.tavg*sex + (1|pit_id) + (1|site.wy2), family = binomial(),
            control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=100000)),
            data = subset(df.m5)); summary(m5)
```
- **_Result:_** _Females will end activity on warmer nights compared to males that remain active even as temperatures decrease._

## Plot Figure 3. Contribution of temperature and length of swarm on sex-specific activity (Models 3-5)
```{r}
print(p.fig3)
```
<div class = "alert alert-info" role="alert">  
  - **_Key findings_**: _Female activity is generally reduced compared to males. Females limit nightly activity to occur at warmer temperatures, and females also end activity fewer days after arriving at the hibernacula and at higher temperatures._
</div>

# How does mating phenology correspond to seasonal disease dynamics? (Figure 4A-B, Models 6-8)

## Model 6: First, do **_pathogen loads_** differ between sexes during the autumn mating (active) season?
```{r}
m6 = lmer(lgdL2~sex + (1|site.wy2), 
          data = df.m6); summary(m6) 
```
  - **_Result:_** _No clear infection bias during autumn mating._

## Model 7, Figure 4A: Then, how do **_pathogen loads_** change seasonally by sex?
```{r}
m7 = lmer(lgdL2~sex*pdate2 + (1|site.wy2), 
          data = df2); summary(m7)
```

  - **_Result_**: _Females develop more severe infections by early hibernation._

## Model 8, Figure 4B: Last, does the end date of autumn activity influence **_infections in early hibernation_**?
```{r}
m8 = lmer(lgdL2~med.maxdate + (1|site.wy2), 
           control=lmerControl(optimizer="bobyqa", optCtrl=list(maxfun=100000)),
           data = df.m8); summary(m8)
```

## Plot Figure 4. Seasonal sex-biased infection (Figure 4A-B; Models 7-8)

```{r}
print(p.fig4)
```
<div class = "alert alert-info" role="alert">  
  - **_Key findings:_** 
    - _Female-biased infection only arises following the autumn mating period._ 
    - _Infections are more severe on bats associated with sites where bats ended activity earlier._
</div>

  
# Supplemental analyses and figures

## Supp Figure 1: Visualize complete dataset

```{r}
print(p.sf1)
```
  - Generally, males are more active than females throughout autumn mating, fully encompassing female swarm activity.

## Use balanced dataset to support sex-specific effects

### Supp Model 1, Supp Fig 2A: Test temperature-dependence of bat activity

```{r}
sm1 = glmer(detect2~bat.tavg*sex + (1|site.wy2) + (1|pit_id), family = binomial(),
             control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=100000)),
             data = subset(df1.tru)); summary(sm1)
```

```{r}
#view temperature trends by sex
kable(sm1.emt)
```

### Supp Model 2, Supp Fig 2B: Differences in nightly temperature by sex and activity

```{r}
sm2 = lmer(bat.tavg~detect2*sex + (1|pit_id) + (1|site.wy2), 
           data = subset(df1.tru)); summary(sm2)
```
  
### Plot Supp Figure 2. Effects of temperature with balanced observations between sexes
```{r}
print(p.sf2)
```
  - **_Results consistent with Model 3 in Figure 3A, using the balanced dataset between sexes:_** 
    - _Females increase nightly activity with temperature compared to males whose activity is relatively unaffected by temperature._ 
    - _The difference between mean temperature on nights when bats were active compared to night when bats were undetected was greater for females than males. Females concentrate their activity to warmer nights compared to males that do not._

## Does body condition affect nightly activity (Supp Figure 3; Supp Model 3)?

### Test whether temperature and mass differently influence activity between sexes

```{r}
sm3 <- glmmTMB(detect2~sex*mass*temp + (1|pit_id),
               family = binomial(),
               data = subset(df.sm3)); summary(sm3)
```

### Plot Supp Figure 3: Effects of mass and temperature on nightly activity

```{r}
print(p.sf3)
```

  - **_Results:_** 
      - _Females with lower body condition (ie body mass) concentrated activity to warm nights, compared to females with higher body condition._
      - _The temperatures at which males were active was not affected by their body condition._
      - _Females adjust nightly activity according to their body condition but males do not, suggesting the sexes are likely budgeting their energy differently._


## Additional analysis showing association between between mating phenology and disease (Supp Figure 4; Supp Figure 4)

### Test whether median end date of autumn activity at a site influenced mean pathogen loads in early hibernation

```{r}
sm4 = lmer(mean.lgdL~med.maxdate + (1|site.wy2), data = subset(df2.sum)); summary(sm4)
```


### Plot Supp Figure 4. Effect of median end date of autumn activity on mean early hibernation infections at site.

```{r}
print(p.sf4)
```
  - **_Results: Consistent with Figure 4B, infection severity in early hibernation is more severe at sites where autumn activity ended sooner._** 

## How many nights of activity do individuals accumulate throughout the length of their active period? 

### Plot Supp Figure 5: Visualize cumulative number of active nights by sex

```{r}
print(p.sf5)
```

### Calculate average number of nights detected among individuals of each sex

```{r}
kable(n.dates.sum)
```

  - Males continue to be active without any clear threshold in the number of dates active, whereas females cease activity after an average of 4 nights.
  
## Model comparisons and validation

### Compare activity period models as additive or interactive with site-year and sex as fixed effects (Supp Table 2)

 First, begin date of activity models
```{r}
m1b.add = lmer(mindate2~site.wy2 + sex + (1|pit_id), data = df.m1)
m1b.int = lmer(mindate2~site.wy2 * sex + (1|pit_id), data = df.m1)
```


 - Compare using AIC
```{r}
kable(AIC(m1b.add,m1b.int))
```


 Then, end date of activity models
```{r}
m2b.add = lmer(maxdate2~site.wy2 + sex + (1|pit_id), data = df.m2)
m2b.int = lmer(maxdate2~site.wy2 * sex + (1|pit_id), data = df.m2)
```

  - Compre using AIC
```{r}
kable(AIC(m2b.add,m2b.int))
```

<div class = "alert alert-info" role="alert">  
  - **_Key takeaway:_**
    - _Sex is more supported as an additive rather than interactive effect in models including site-year as fixed effects._
    - _The dates that activity started and ended varied among sites and years, but females consistently were later to start and earlier to end._
</div>


### View results of null model comparisons and AUC estimates from k-fold cross validation of binomial models

```{r}
kable(nullcomps_full)
```

  - All AICs of reported models are >2 scores below the null models (structured with response~1), indicating improvement over the null. 

### View AUC scores derived from k-fold cross validation of the logistic models reported in the main results.
```{r}
kable(kfold_full)
```
   - Results indicate that >70%, 75%, and 83% of our test data was successfully predicted by the training models of Model 3, Model 4, and Model 5, respectively.

## View sampling distributions by site, year and sex where applicable by model
```{r, echo=FALSE,results='hide'}
print(samplesizes_full)
```

